#ifndef __Collections_IDictionary_H__
#define __Collections_IDictionary_H__

///<summary>
/// IDictionary<T>
///</summary>
//+ requires: Collections_IEnumerator(T)
//+ requires: Collections_IEnumerable(T)
//+ requires: Collections_ICollection(T)
//+ requires: Collections_KeyValuePair(T)
#define Collections_IDictionary(TKey,TValue) bindT(Collections_IDictionary,TKey##TValue)
#define Declare_Collections_IDictionary(TKey, TiKey, TValue, TiValue) \
	private enum { \
		_Collections_IDictionary_##TKey##TValue##VIndex_Add, \
		_Collections_IDictionary_##TKey##TValue##VIndex_ContainsKey, \
		_Collections_IDictionary_##TKey##TValue##VIndex_Remove, \
		_Collections_IDictionary_##TKey##TValue##VIndex_TryGetValue, \
		_Collections_IDictionary_##TKey##TValue##VIndex_getKeys, \
		_Collections_IDictionary_##TKey##TValue##VIndexNext, \
	}; \
	public interfaceT(Collections_IDictionary,T,classInterface2(Collections_ICollection(Collections_KeyValuePair(TKey, TValue)), Collections_IEnumerable(Collections_KeyValuePair(TKey, TValue))), \
		virtualT(Collections_IDictionary,T,void,Add, TiKey key, TiValue value); \
		virtualT(Collections_IDictionary,T,bool,ContainsKey, TiKey key); \
		virtualT(Collections_IDictionary,T,bool,Remove, TiKey key); \
		virtualT(Collections_IDictionary,T,bool,TryGetValue, TiKey key, out TiValue value); \
		getIndexVirtualT(Collections_ICollection,T,TValue); \
		setIndexVirtualT(Collections_ICollection,T,TValue); \
		getVirtualT(Collections_ICollection,T,Collections_ICollection(TKey),Keys); \
		getVirtualT(Collections_ICollection,T,Collections_ICollection(TValue),Values); \
	);
#define Implement_Collections_IDictionary(T, Ti) \
	Implement_TypeTI(Collections_IDictionary,T,)

#endif /* __Collections_IDictionary_H__ */